package com.ml.mall.utils;

import com.ml.mall.bean.page.Page;
import org.springframework.beans.BeanUtils;

import java.lang.reflect.Constructor;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @description MyBatis工具类
 * @author yx
 * @date 2021/9/27
 * @version 1.0
*/
public class MyBatisUtil {

    /**
     * 将mybatis-plus分页查询结果转化为本项目中的page对象,并把记录转化为指定类型
     * @param queryPage 分页查询后的mybatis-plus中的page对象
     * @param recordClass 查询结果转化后的类型
     * @return 本项目中的page对象
     */
    public static <Q, R> Page<R> parsePageResult(com.baomidou.mybatisplus.extension.plugins.pagination.Page<Q> queryPage, Class<R> recordClass) {
        //将结果转化为本项目中的page对象
        //页码与每页记录数
        Long current = queryPage.getCurrent();
        Long size = queryPage.getSize();
        Page<R> resultPage = new Page(current.intValue(), size.intValue());

        //总记录数
        Long total = queryPage.getTotal();
        resultPage.setTotal(total.intValue());

        //将结果转换为目标类型
        List<Q> queryRecords = queryPage.getRecords();
        List<R> resultRecords = null;
        if(null != queryRecords){
            resultRecords = queryRecords.stream().map(queryRecord -> {
                try{
                    //反射创建对象,进行值拷贝
                    Constructor<R> constructor = recordClass.getConstructor();
                    R resultRecord = constructor.newInstance();
                    BeanUtils.copyProperties(queryRecord, resultRecord);
                    return resultRecord;
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }).collect(Collectors.toList());
        }
        resultPage.setRecords(resultRecords);
        return resultPage;
    }

    /**
     * 将mybatis-plus分页查询结果转化为本项目中的page对象
     * @param queryPage
     * @return
     */
    public static <T> Page<T> parsePageResult(com.baomidou.mybatisplus.extension.plugins.pagination.Page<T> queryPage) {
        //页码与每页记录数
        Long current = queryPage.getCurrent();
        Long size = queryPage.getSize();
        Page<T> resultPage = new Page(current.intValue(), size.intValue());

        //总记录数
        Long total = queryPage.getTotal();
        resultPage.setTotal(total.intValue());

        //结果转换
        List<T> records = queryPage.getRecords();
        resultPage.setRecords(records);

        return resultPage;
    }
}
